#ifndef ERROR_HPP
#define ERROR_HPP
#include "properties.hpp"
#include "types.hpp"
#include "trans.hpp"
#include "vartab.hpp"
#include <string>
#include <iostream>

using namespace std;

class Error {
public:
    // Esta função deve ser utilizada somente para sinalizar condições anormais
    // do compilador que signifiquem, necessariamente, um erro interno de
    // codificação.
    static void panic(const char* file, int linha, string msg);
    // Interrompe a compilação exibindo a mensagem 'msg' na tela, além do nome
    // do arquivo de entrada, a linha e a coluna do mesmo onde foram encontrados
    // os erros.
    static void abort(string msg);
    // Utilizado para interromper a compilação ao encontrar uma declaração com
    // um identificador já utilizado.
    static void dupid(string name, Type* type);
    // Utilizado para interromper a compilação ao encontrar uma atribuição entre
    // tipos incompatíveis.
    static void inctypesassign(Properties &id, Properties& exp);
    // Atribuição de vetores ou arrays incompatíveis.
    static void inctypeslist(Type* listtype, Properties& var);
    // Operação não definida.
    static void opundef(Properties& opl, Properties& opr, string ops);
    // Negação não definida.
    static void negundef(Properties& var, string op);
    // Variável não declarada.
    static void decmiss(string name);
    // Troca entre tipos incompatíveis.
    static void swapwrong(Properties& var1, Properties& var2);
    // Teste que utiliza tipo não lógico.
    static void nonlogictest(Properties& test);
    // Exceção gerada em locais onde um array ou vetor é esperado.
    static void notarray(Properties& array, Properties& index);
    // Exceção gerada em locais onde um inteiro é esperado.
    static void notindex(Properties& array, Properties& index);
    // Exceção gerada ao tentar imprimir uma variável composta.
    static void printcomplex(Properties& var);
    // Exceção gerada ao terntar ler para uma variável composta.
    static void scancomplex(Properties& var);
    // Exceção gerada ao tentar ler para uma constante.
    static void scantoconst(Properties& var);
    // Exceção gerada em locais onde um inteiro é esperado.
    static void nonintindex(Properties& index);
    // Exceção gerada em locais onde um vetor ou array de números é esperado.
    static void nonnumericl(Properties& a, Properties& b);
    // Exceção gerada quando uma função é redeclarada.
    static void dupmap(Function* m1, Function* m2);
    // Exceção gerado quando uma função é referenciada sem ter sido definida.
    static void mapundef(Function* m1);
};

void yyerror(const char* st);

#endif /* ERROR_HPP */
